package poly;
public class Operations {
private Polynomial p;
private Monomial mon1, mon2, mon;
private int i, degree, deg;
public Polynomial addition(Polynomial p1, Polynomial p2) {
p = new Polynomial();
mon1 = null;
mon2 = null;
if (p1.getDegree() >= p2.getDegree()) {
degree = p1.getDegree();
deg = p2.getDegree();
p.setDegree(degree);
for (i = degree; i >= 0; i--) {
mon = new Monomial();
mon1 = p1.getElement(degree - i);
if (i > deg) {
mon.setPower(i);
mon.setIntCoeff(mon1.getIntCoeff());
} else {
for (int j = 0; j <= deg; j++) {
mon2 = p2.getElement(j);
if (mon2.getPower() == mon1.getPower()) {
mon.setPower(mon1.getPower());
mon.setIntCoeff(mon1.getIntCoeff() + mon2.getIntCoeff());
}
}
}
p.addToPoly(mon);
}
} else {
degree = p2.getDegree();
deg = p1.getDegree();
p.setDegree(degree);
for (i = degree; i >= 0; i--) {
mon = new Monomial();
mon2 = p2.getElement(degree - i);
if (i > deg) {
mon.setPower(i);
mon.setIntCoeff(mon2.getIntCoeff());
} else {
for (int j = 0; j <= deg; j++) {
mon1 = p1.getElement(j);
if (mon1.getPower() == mon2.getPower()) {
mon.setPower(mon2.getPower());
mon.setIntCoeff(mon1.getIntCoeff() + mon2.getIntCoeff());
}
}
}
p.addToPoly(mon);
}
}
return p;
}
public Polynomial subtraction(Polynomial p1, Polynomial p2) {
p = new Polynomial();
mon1 = null;
mon2 = null;
if (p1.getDegree() >= p2.getDegree()) {
degree = p1.getDegree();
deg = p2.getDegree();
p.setDegree(degree);
for (i = degree; i >= 0; i--) {
mon = new Monomial();
mon1 = p1.getElement(degree - i);
if (i > deg) {
mon.setPower(i);
mon.setIntCoeff(mon1.getIntCoeff());
} else {
for (int j = 0; j <= deg; j++) {
mon2 = p2.getElement(j);
if (mon2.getPower() == mon1.getPower()) {
mon.setPower(mon1.getPower());
mon.setIntCoeff(mon1.getIntCoeff() - mon2.getIntCoeff());
}
}
}
p.addToPoly(mon);
}
} else {
degree = p2.getDegree();
deg = p1.getDegree();
p.setDegree(degree);
for (i = degree; i >= 0; i--) {
mon = new Monomial();
mon2 = p2.getElement(degree - i);
if (i > deg) {
mon.setPower(i);
mon.setIntCoeff(mon2.getIntCoeff());
} else {
for (int j = 0; j <= deg; j++) {
mon1 = p1.getElement(j);
if (mon1.getPower() == mon2.getPower()) {
mon.setPower(mon2.getPower());
mon.setIntCoeff(mon1.getIntCoeff() - mon2.getIntCoeff());
}
}
}
p.addToPoly(mon);
}
}
return p;
}
public Polynomial derivate(Polynomial p1) {
p = new Polynomial();
degree = p1.getDegree();
p.setDegree(degree-1);
mon1 = null;
for (int i = degree; i >= 0; i--) {
mon = new Monomial();
if (i != degree) {
mon1 = p1.getElement(i);
mon.setIntCoeff(mon1.getIntCoeff() * mon1.getPower());
mon.setPower(mon1.getPower() - 1);
p.addToPoly(mon);
}
}
return p;
}
public Polynomial integrate(Polynomial p1) {
double coeff, pow;
p = new Polynomial();
degree = p1.getDegree();
p.setDegree(degree+1);
mon1 = null;
for (int i = degree; i >= 0; i--) {
mon = new Monomial();
mon1 = p1.getElement(i);
coeff = (double) mon1.getIntCoeff();
pow = (double) mon1.getPower();
if (pow != 0) {
mon.setDoubleCoeff(coeff / (pow+1));
} else {
mon.setDoubleCoeff(coeff);
}
mon.setPower(mon1.getPower() + 1);
p.addToPoly(mon);
}
return p;
}
public Polynomial multiply(Polynomial p1, Polynomial p2){
p=new Polynomial();
int pow1, pow2, coeff1, coeff2;
Polynomial partial=new Polynomial();
degree=p1.getDegree()+p2.getDegree();
mon1=null;
mon2=null;
for(int i=0;i<p1.getSize();i++){
mon1=p1.getElement(i);
pow1=mon1.getPower();
coeff1=mon1.getIntCoeff();
for(int j=0;j<p2.getSize();j++){
mon2=p2.getElement(j);
pow2=mon2.getPower();
coeff2=mon2.getIntCoeff();
mon=new Monomial();
mon.setPower(pow1+pow2);
mon.setIntCoeff(coeff1*coeff2);
partial.addToPoly(mon);
}
}
for(int i=0;i<partial.getSize();i++){
mon1=partial.getElement(i);
pow1=mon1.getPower();
coeff1=mon1.getIntCoeff();
for(int j=i+1;j<partial.getSize();j++){
mon2=partial.getElement(j);
pow2=mon2.getPower();
coeff2=mon2.getIntCoeff();
if(pow1==pow2){
coeff1+=coeff2;
partial.removeElem(j);
}
}
mon=new Monomial();
mon.setIntCoeff(coeff1);
mon.setPower(pow1);
p.addToPoly(mon);
}
return p;
}
public Polynomial divide(Polynomial p1, Polynomial p2){
int deg1, deg2;
double coeff1, coeff2;
Polynomial partial = new Polynomial();
Polynomial x = new Polynomial();
Monomial mo;
p=new Polynomial();
deg1=p1.getDegree();
deg2=p2.getDegree();
mon=new Monomial();
mon1=p1.getElement(deg1);
mon2=p2.getElement(deg2);
coeff1=(double) mon1.getIntCoeff();
coeff2=(double) mon2.getIntCoeff();
if((mon1.getPower()>mon2.getPower()) || (mon1.getPower()==mon2.getPower() && coeff1>=coeff2)){
mon.setDoubleCoeff(coeff1/coeff2);
mon.setPower(mon1.getPower()-mon2.getPower());
p.addToPoly(mon);
for(int i=0; i<=deg2+mon.getPower();i++){
mo=new Monomial();
if(i<=deg2){
mon2=p2.getElement(i);
mo.setDoubleCoeff(mon.getDoubleCoeff()*coeff1);
mo.setPower(mon.getPower()+mon2.getPower());
}
else{
mo.setDoubleCoeff(0);
mo.setPower(deg2+mon.getPower()-i);
}
partial.addToPoly(mo);
}
for(i=0;i<partial.getSize();i++){
if(i<=deg2)
x.addToPoly(partial.getElement(i));
else{
mo=new Monomial();
mo.setDoubleCoeff(0);
mo.setPower(i);
x.addToPoly(mo);
}
}
if(x.getDegree()>=partial.getDegree()){
partial=subtraction(x, partial);
p=divide(partial, p2);
}
}
else{
mon.setDoubleCoeff(0);
mon.setPower(0);
}
return p;
}
}